/**
 * @file interfacefifo.h
 * @brief Definisce le strutture e le funzioni per gestire delle comunicazioni tramite fifo.
 *
 * La struttura principale @see InterfaceFifo definisce gli attributi per specificare
 * l'utilizzo di una fifo.
 *
 * @date Mar 10, 2012
 * @author Francesco Corvino
 */

#ifndef INTERFACEFIFO_H_
#define INTERFACEFIFO_H_

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>

/**
 * @brief Stringa che definisce la terminazione delle fifo in ingresso
 */
#define FILENAME_FIFOIN "%s/%d-in.fifo"

/**
 * @brief Stringa che definisce la terminazione delle fifo in uscita
 */
#define FILENAME_FIFOOUT "%s/%d-out.fifo"

/**
 * @brief Nome del file di registrazione delle sessioni
 */
#define FILENAME_FIFOLISTENER "listener.fifo"

/**
 * @brief definizioni utilizzate per specificare il verso della fifo
 */
#define FIFO_CLIENT 0
#define FIFO_SERVER 1

#define MAX_LENGHT_DIR 255
#define MAX_SIZE_BUFFER BUFSIZ
#define NEWSESSION_STR "newsession"

//////////////////////////////////////////////////////////////////////////////////////////////
////// Strutture dati ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

typedef struct interfaceFifo {
	char name[255];
	int openmode;
	int pipefd;
	char status;
} InterfaceFifo;

/**
 * @brief Definisce una struttura per impostare i parametri degli ElaborationEntity per le fifo.
 *
 * @see ElaborationEntity l'attributo <code>HiddenType params</code> specifica i parametri dell'entità.
 */
typedef struct paramsEntity {
	char pathtodir[MAX_LENGHT_DIR];
	int pid;
} ParamsEntity;

/**
 * @brief Struttura per impostare i parametri delle comunicazioni su fifo.
 *
 * @see HostCommInstance
 */
typedef struct paramsComm {
	InterfaceFifo infifo;
	InterfaceFifo outfifo;
} ParamsComm;

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per gestire la comunicazione con la FIFO /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

int InterfaceFifo_createFifo(char * name);

void InterfaceFifo_startComm(InterfaceFifo * fifo);

void InterfaceFifo_closeComm(InterfaceFifo * fifo);

int InterfaceFifo_rcvMsg(InterfaceFifo * fifo,char * buffer,int maxdim);

int InterfaceFifo_sendMsg(InterfaceFifo * fifo,char * buffer);

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per l'inizializzazione dei dati relativi a una Sessione //////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void ParamsComm_Init(ParamsComm * obj, int pid, char* pathToDir, int versus );

int ParamsComm_Start(ParamsComm * obj);

void ParamsComm_Close(ParamsComm * obj);

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per lo startup delle comunicazioni ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void registerSession(char* applicationDir);

#endif /* INTERFACEFIFO_H_ */
